/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import model.Film;
import model.FilmMaatschappij;
import persistence.FilmMaatschappijService;
import persistence.FilmService;

/**
 *
 * @author Matthy & Jelle
 */
public class FilmPanel extends JPanel{
  /**
   * Labels.
   */
  private JLabel maatschappijLabel;
  private JLabel titelLabel;
  private JLabel genreLabel;
  private JLabel korteInhoudLabel;
  private JLabel speelDuurLabel;
  private JLabel landLabel;

  /**
   * Input fields.
   */
  private JComboBox maatschappijSelect;
  private JTextField titelField;
  private JComboBox genreSelect;
  private JTextArea korteInhoudArea;
  private JTextField speelDuurField;
  private JCheckBox kinderenToegelatenCheckBox;
  private JTextField landField;

  /**
   * Buttons.
   */
  private JButton submitButton;

  public FilmPanel() {
    super();
    initialiseerComponenten();
    layoutComponenten();
    initialiseerEventHandlers();
  }

  private void initialiseerComponenten() {
    // Maatschappij
    FilmMaatschappijService fms = new FilmMaatschappijService();
    List<FilmMaatschappij> maatschappijen = fms.getList();
    this.maatschappijLabel = new JLabel("FimMaatschappij*");
    this.maatschappijSelect = new JComboBox(maatschappijen.toArray());

    // Filmtitel
    this.titelLabel = new JLabel("Titel*");
    this.titelField = new JTextField();

    // Genre
    this.genreLabel = new JLabel("Genre*");
    String[] genres = {
      "Adventure",
      "Action",
      "Romance",
      "Science-Fiction",
      "Comedy",
      "Drama",
      "Fantasy",
      "Family",
      "Crime",
      "War",
      "Mystery",
      "Documentary",
      "Thriller",
      "Horror",
      "Western"
    };
    this.genreSelect = new JComboBox(genres);

    // Korte inhoud
    this.korteInhoudLabel = new JLabel("Korte Inhoud");
    this.korteInhoudArea = new JTextArea();
    this.korteInhoudArea.setLineWrap(true);

    // Speelduur
    this.speelDuurLabel = new JLabel("Speelduur (minuten)*");
    this.speelDuurField = new JTextField();

    // Land
    this.landLabel = new JLabel("Land");
    this.landField = new JTextField();

    // Kinderen Toegelaten
    this.kinderenToegelatenCheckBox = new JCheckBox("Kinderen Toegelaten");

    // Submit button
    this.submitButton = new JButton("Opslaan");
  }

  private void layoutComponenten() {
    this.setLayout(new GridLayout(8, 2));

    // Maatschappij
    this.add(this.maatschappijLabel);
    this.add(this.maatschappijSelect);

    // Titel
    this.add(this.titelLabel);
    this.add(this.titelField);

    // Genre
    this.add(this.genreLabel);
    this.add(this.genreSelect);

    // Korte inhoud
    this.add(this.korteInhoudLabel);
    JScrollPane scrollpane = new JScrollPane(this.korteInhoudArea);
    scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    this.add(scrollpane);

    // Speelduur
    this.add(this.speelDuurLabel);
    this.add(this.speelDuurField);

    // Land
    this.add(this.landLabel);
    this.add(this.landField);

    // Lege label => Checkbox heeft geen aparte label
    this.add(new JLabel());
    // Kinderen Toegelaten
    this.add(this.kinderenToegelatenCheckBox);

    // Submit button
    this.add(this.submitButton);
  }

  private void initialiseerEventHandlers() {
    this.submitButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        Boolean error = false;
        if (titelField.getText().isEmpty()) {
          titelLabel.setForeground(Color.RED);
          error = true;
        }
        else {
          // reset the color.
          titelLabel.setForeground(Color.BLACK);
        }
        if (maatschappijSelect.getSelectedIndex() == -1) {
          maatschappijLabel.setForeground(Color.RED);
          error = true;
        }
        else {
          // reset the color.
          maatschappijLabel.setForeground(Color.BLACK);
        }
        try {
          Integer speelduur = Integer.parseInt(speelDuurField.getText(), 10);
          if (speelduur < 1) {
            error = true;
            speelDuurLabel.setForeground(Color.RED);
          }
          else {
            speelDuurLabel.setForeground(Color.BLACK);
          }
        } catch(Exception ex) {
          speelDuurLabel.setForeground(Color.RED);
          error = true;
        }

        if (!error) {

          FilmMaatschappij fm = (FilmMaatschappij) maatschappijSelect.getSelectedItem();
          Film f = new Film();
          f.setFilmMaatschappij(fm);
          f.setTitel(titelField.getText());
          f.setGenre(genreSelect.getSelectedItem().toString());
          f.setKorteInhoud(korteInhoudArea.getText());
          f.setSpeelDuur(Integer.parseInt(speelDuurField.getText()));
          f.setLand(landField.getText());
          f.setKinderenToegelaten(kinderenToegelatenCheckBox.isSelected());
          new FilmService().save(f);
          reset();
        }
      }
    });

  }

  private void reset() {
    this.maatschappijSelect.setSelectedIndex(0);
    this.titelField.setText("");
    this.genreSelect.setSelectedIndex(0);
    this.korteInhoudArea.setText("");
    this.speelDuurField.setText("");
    this.landField.setText("");
    this.kinderenToegelatenCheckBox.setSelected(false);
  }
}
